home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / polyview / polyvw31.lha / Polyview3.1 / new / misc.c < prev    next >
C/C++ Source or Header  |  1993-08-24  |  4KB  |  171 lines

  1. /* misc.c --- The "misc" commands for alvis' user interface; see ui.c */
  2.  
  3. /*---------------------------------------------------------------------------*/
  4.  
  5. #include "Xmx.h"
  6. #include <gl/image.h>
  7. #include <varargs.h>
  8.  
  9.  
  10. /*---------------------------------------------------------------------------*/
  11.  
  12.  
  13. /* GL stuff for image dumping */
  14. typedef short            sint16 ;
  15. typedef unsigned short   uint16 ;
  16. typedef int              sint32 ;
  17. typedef unsigned int     uint32 ;
  18. typedef float            flot32 ;
  19. typedef double           flot64 ;
  20.  
  21. static void lrecttoimg(char *,sint32,sint32,sint32,sint32,uint32 *) ;
  22. static void cpacktorgba
  23.   (uint32 *l,uint16 *r,uint16 *g,uint16 *b,uint16 *a,sint32 n) ;
  24.  
  25.  
  26. /* error handler for the image library */
  27. static void rgb_err_hdlr(char *str)
  28. {
  29.   fputs(str, stderr);
  30. }
  31. /*--------------------------------------------------------------------------*/
  32.  
  33. void DumpRGB(Widget w, int width, int height, char *fname)
  34. {
  35.   static Matrix m;
  36.   static unsigned long *rgbptr;
  37.   static Boolean first_time = True;
  38.  
  39.   if (first_time)
  40.     {
  41.       first_time = False;
  42.       /* set the error handler for the image library */
  43.       i_seterror(rgb_err_hdlr);
  44.     }
  45.  
  46.   /* Focus on the right window. */
  47.   XmxWinset (w);
  48.  
  49.   /* Save the projection matrix. */
  50.   pushmatrix ();
  51.   mmode (MPROJECTION);
  52.   getmatrix (m);
  53.   mmode (MVIEWING);
  54.   /* Save the viewport. */
  55.   pushviewport ();
  56.  
  57.   
  58.   readsource (SRC_FRONT);
  59.   screenspace ();
  60.   
  61.   if ((rgbptr = (unsigned long *) malloc
  62.        ( height * width * sizeof(unsigned long))) == 0)
  63.     {
  64.       fprintf(stderr, "Window dump malloc failed.\n");
  65.     }
  66.   else
  67.     {
  68.       lrectread (1, 1, width, height, rgbptr);
  69.       lrecttoimg (fname, 1, 1, width, height, (uint32 *)rgbptr);
  70.     }
  71.   
  72.   /* Restore the projection matrix. */
  73.   mmode (MPROJECTION);
  74.   loadmatrix (m);
  75.   mmode (MVIEWING);
  76.   /* Restore the viewport. */
  77.   popviewport ();
  78.   popmatrix ();
  79.  
  80. }
  81.  
  82. /*--------------------------------------------------------------------------*/
  83.  
  84. /* ALL THIS CODE IS FOR THE RGB DUMPS -- Hacked straight from SGI demos */
  85. /********************************************************************** 
  86. *  lrecttoimg()  -
  87. **********************************************************************/
  88. static void lrecttoimg(char *name,sint32 x1,sint32 y1,sint32 x2,sint32 y2,
  89.                uint32 *lbuf)
  90. {
  91.   sint32 xsize, ysize, y;
  92.   IMAGE  *oimage;
  93.   uint16 *rbuf, *gbuf, *bbuf, *abuf;
  94.   uint32 *save=lbuf;
  95.   
  96.   xsize = x2-x1+1;
  97.   ysize = y2-y1+1;
  98.   oimage = iopen(name,"w",RLE(1),3,xsize,ysize,4);
  99.  
  100.   if (!oimage)
  101.     {
  102.       return;
  103.     }
  104.  
  105.   rbuf = (uint16 *)malloc(xsize*sizeof(short));
  106.   gbuf = (uint16 *)malloc(xsize*sizeof(short));
  107.   bbuf = (uint16 *)malloc(xsize*sizeof(short));
  108.   abuf = (uint16 *)malloc(xsize*sizeof(short));
  109.  
  110.   for(y=0; y<ysize; y++)
  111.     {
  112.       cpacktorgba(lbuf,rbuf,gbuf,bbuf,abuf,xsize);
  113.       putrow(oimage,rbuf,y,0);
  114.       putrow(oimage,gbuf,y,1);
  115.       putrow(oimage,bbuf,y,2);
  116.       putrow(oimage,abuf,y,3);
  117.       lbuf += xsize;
  118.     }
  119.  
  120.   iclose(oimage);
  121.   free(save);
  122.   free(rbuf);
  123.   free(gbuf);
  124.   free(bbuf);
  125. }
  126.  
  127. #define CPACKTORGBA(l,r,g,b,a)            \
  128.   val = (l);                              \
  129.   (r) = (val>>0) & 0xff;                  \
  130.   (g) = (val>>8) & 0xff;                  \
  131.   (b) = (val>>16) & 0xff;                 \
  132.   (a) = (val>>24) & 0xff;                 
  133.  
  134. /********************************************************************** 
  135. *  cpacktorgba()  -
  136. **********************************************************************/
  137. static void cpacktorgba(uint32 *l,uint16 *r,uint16 *g,uint16 *b,uint16 *a,sint32 n)
  138. {
  139.   unsigned long val;
  140.  
  141.   while(n>=8)
  142.     {
  143.       CPACKTORGBA(l[0],r[0],g[0],b[0],a[0]);
  144.       CPACKTORGBA(l[1],r[1],g[1],b[1],a[1]);
  145.       CPACKTORGBA(l[2],r[2],g[2],b[2],a[2]);
  146.       CPACKTORGBA(l[3],r[3],g[3],b[3],a[3]);
  147.       CPACKTORGBA(l[4],r[4],g[4],b[4],a[4]);
  148.       CPACKTORGBA(l[5],r[5],g[5],b[5],a[5]);
  149.       CPACKTORGBA(l[6],r[6],g[6],b[6],a[6]);
  150.       CPACKTORGBA(l[7],r[7],g[7],b[7],a[7]);
  151.       l += 8;
  152.       r += 8;
  153.       g += 8;
  154.       b += 8;
  155.       a += 8;
  156.       n -= 8;
  157.     }
  158.  
  159.   while(n--)
  160.     {
  161.       CPACKTORGBA(l[0],r[0],g[0],b[0],a[0]);
  162.       l++;
  163.       r++;
  164.       g++;
  165.       b++;
  166.       a++;
  167.     }
  168. }
  169.  
  170. /*--------------------------------------------------------------------------*/
  171.